(function () {
  /**
   * 以abstract开头的类是抽象类
   *  抽象类和其他类区别不大，只是不能用来创建对象
   *  抽象类就是专门用来被继承的类，一般用于父类
   *  抽象类可以添加抽象方法，具体实现由子类实现
   */
  abstract class Animal {
    name: string;
    constructor(name: string) {
      this.name = name;
    }

    /**
     * 定义一个抽象方法
     * 抽象反方使用abstract开头，没有方法体
     * 抽象方法只能定义在抽象类中，子类必须对抽象方法进行重写
     */
    abstract sayHello(): void;
  }

  class Dog extends Animal {
    /**
     * 在子类的方法中super就是父类
     * 在子类的构造函数中super()指的是调用父类中的构造函数
     */
    age: number;
    constructor(name: string, age: number) {
      super(name); // 调用父类的构造函数
      this.age = age;
    }

    sayHello(): void {
      // super.sayHello();
      console.log("汪汪汪");
    }
  }

  const dog = new Dog("旺财", 3);
  dog.sayHello();
})();
